/**
 * 递归地将对象中的所有 BigInt 值转换为字符串
 * 兼容 Date（输出 ISO 字符串）和 Prisma.Decimal（转为字符串），用于解决 JSON.stringify 无法序列化 BigInt 的问题
 */
export function serializeBigInt(obj: any): any {
  if (obj === null || obj === undefined) {
    return obj;
  }

  // BigInt -> string
  if (typeof obj === 'bigint') {
    return String(obj);
  }

  // Date -> ISO string
  if (obj instanceof Date) {
    return obj.toISOString();
  }

  // Prisma.Decimal -> string (检测多种可能的 Decimal 对象)
  if (obj && typeof obj === 'object') {
    // 检测 Prisma.Decimal 或 Decimal.js 对象
    if (typeof obj.toString === 'function' &&
        (obj.constructor?.name === 'Decimal' ||
         obj.d !== undefined ||
         obj.toNumber !== undefined)) {
      return obj.toString();
    }
  }

  if (Array.isArray(obj)) {
    return obj.map(item => serializeBigInt(item));
  }

  if (typeof obj === 'object') {
    const serialized: any = {};
    for (const [key, value] of Object.entries(obj)) {
      serialized[key] = serializeBigInt(value);
    }
    return serialized;
  }

  return obj;
}

/**
 * Express 响应助手函数，自动处理 BigInt 序列化
 */
export function jsonResponse(res: any, data: any, statusCode: number = 200) {
  return res.status(statusCode).json(serializeBigInt(data));
}
